<?php

namespace App\Controller;

use App\Common\AuthRequestMap;
use App\Exception\BusinessException;
use App\Service\JWTService;
use Hyperf\HttpServer\Contract\RequestInterface;

/**
 * Http 服务请求入口
 *
 * @author WangBin
 */
class HttpController extends BaseController
{
    /**
     * 请求统一入口
     *
     * @param RequestInterface $request
     * @return array
     */
    public function handle(RequestInterface $request)
    {
        // 获取 Service
        $service = $request->input('service');
        if(empty($service)) {
            BusinessException::error(500, "业务名称为空");
        }
        // 获取方法名
        $method = $request->input('method');
        if(empty($method)) {
            BusinessException::error(500, "方法名称为空");
        }
        // 获取参数
        $params = $request->input('params', []);

        // 校验需要授权
        if(in_array($service . '::' . $method, AuthRequestMap::ROUTE_LIST)) {
            // 需要授权的话，要将 token 解析的用户信息，注入 $params 中，供后续业务使用
            // 获取请求头中的 token
            if(!$request->hasHeader('Authorization')) {
                BusinessException::error(403, '拒绝访问');
            }
            $token = $request->getHeader('Authorization')[0];
            if(empty($token)) {
                BusinessException::error(403, '拒绝访问');
            }
            $token = str_replace('Bearer ', '', $token);
            $result = JWTService::getInstance()->decode($token);
            if(empty($result) || empty($result['user_id'])) {
                BusinessException::error(401, '请重新登录');
            }
            $params['auto_user_id'] = $result['user_id'];
            $params['auto_username'] = $result['username'];
            $params['auto_login_name'] = $result['login_name'];
        }
        print_r($params);
        // Service 对象
        $serviceImpl = call_user_func(array("\\App\\Service\\" . $service, 'getInstance'));
        if(empty($serviceImpl)) {
            BusinessException::error(500, "service不存在");
        }
        // 方法是否存在
        if(!method_exists($serviceImpl, $method)) {
            BusinessException::error(500, "method不存在");
        }
        // 业务处理
        $result = call_user_func(array($serviceImpl, $method), $params);
        return $this->success($result);
    }
}